import axios from 'axios';
import { message } from 'antd';

// 设置默认超时时间
axios.defaults.timeout = 15000; // 15秒

// 判断当前环境，开发环境使用相对路径，生产环境使用配置的完整URL
const isDevelopment = import.meta.env.DEV;
const API_BASE_URL = isDevelopment 
  ? '/api' // 开发环境使用相对路径，配合Vite的代理服务器
  : (import.meta.env.VITE_API_BASE_URL || 'http://localhost:5000/api'); // 生产环境使用配置的URL

// 创建axios实例
const apiClient = axios.create({
  baseURL: API_BASE_URL,
  headers: {
    'Content-Type': 'application/json'
  },
  withCredentials: true // 启用跨域请求时发送凭证
});

// 请求拦截器 - 添加认证token
apiClient.interceptors.request.use(
  config => {
    // 从localStorage或sessionStorage中获取token
    const token = localStorage.getItem('token') || sessionStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    console.error('请求拦截器错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器 - 处理认证错误和其他常见错误
apiClient.interceptors.response.use(
  response => response,
  error => {
    // 处理网络错误
    if (!error.response) {
      message.error('网络连接失败，请检查您的网络连接或服务器状态');
      console.error('网络错误:', error);
      return Promise.reject(new Error('网络连接失败'));
    }

    // 根据状态码处理不同的错误情况
    switch (error.response.status) {
      case 401: // 未授权
        // 清除认证信息
        localStorage.removeItem('token');
        localStorage.removeItem('userInfo');
        sessionStorage.removeItem('token');
        sessionStorage.removeItem('userInfo');
        
        // 只有当前页面不是登录页时才重定向
        if (!window.location.pathname.includes('login')) {
          message.warning('登录已过期，请重新登录');
          window.location.href = '/login';
        }
        break;
      
      case 403: // 禁止访问
        message.error('您没有权限访问此资源');
        break;
      
      case 404: // 资源不存在
        message.error('请求的资源不存在');
        break;
      
      case 500: // 服务器错误
        message.error('服务器内部错误，请稍后再试');
        break;
      
      default:
        if (error.response.data && error.response.data.message) {
          message.error(error.response.data.message);
        } else {
          message.error(`请求失败(${error.response.status})`);
        }
        break;
    }
    
    // 将详细错误信息记录到控制台供开发者查看
    console.error('API请求错误:', {
      url: error.config.url,
      method: error.config.method,
      status: error.response?.status,
      data: error.response?.data
    });
    
    return Promise.reject(error);
  }
);

// 导出实例
export default apiClient; 